多个文件导出并打成zip压缩包下载

本文介绍了一个Java API,用于通过HttpServletRequest和HttpServletResponse将多个Excel文件打包成一个zip文件,适合前端处理多文件压缩需求。控制器层提供了详细的GET请求处理和私有压缩方法,展示了如何使用ZipOutputStream将文件添加到压缩包中。
摘要由CSDN通过智能技术生成

ps: 需要注意的是此方法即使只有一个文件也是导出成zip,所以如果需求是单个文件不压缩,多个文件才打包压缩的话需要前端处理调两个接口.这里只贴出打包导出的代码.
直接上Controller层代码,如下 :


    @ApiOperation("导出多个xlsx文件")
    @RequestMapping(path = "/exportMore", method = RequestMethod.GET)
    @ResponseBody
    public void downloadFile(HttpServletRequest request,HttpServletResponse response, @RequestParam @ApiParam(value = "业务对象id,中间用,分隔", required = true) String ids) throws Exception {
        try {
            response.setContentType("APPLICATION/OCTET-STREAM");
            response.setHeader("Content-Disposition", "attachment; filename=" + "export.zip");
            compressZip(ids, response.getOutputStream());
        } catch (IOException e) {
        }
    }
    //----------------------------------下面是封装好的私有方法---------------------------------
    /**
     * 多个文件打包压缩下载方法
     *
     * @param outputStream
     */
    private void compressZip(String ids, OutputStream outputStream) {
    //我这里的ids是实体对象的id用英文逗号分隔拼成的字符串,
    //到业务实现类里面拿着去数据层取对象生成文件的,根据你们需求不同可以改
        ZipOutputStream zipOutStream = null;
        //------根据需求的不同每个人不一样,反正走完for循环得到一个文件集合就行-----
        List<File> fileList = Lists.newArrayList();
        for (String id : ids.split(",")) {
        //------这一步是文件生成并给出路径,或者直接拿已有的文件的路径-----
             String filePath = xxxXxxService.makeFile(id);
             File file = new File(filePath);
             fileList.add(file);
        }
        try {
            //-- 包装成ZIP格式输出流
            zipOutStream = new ZipOutputStream(new BufferedOutputStream(outputStream));
            // -- 设置压缩方法
            zipOutStream.setMethod(ZipOutputStream.DEFLATED);
            //-- 下面将多文件循环写入压缩包
            for (File file : fileList) {
                byte[] data = Files.readAllBytes(file.toPath());
                zipOutStream.putNextEntry(new ZipEntry(file.getName()));
                zipOutStream.write(data);
                zipOutStream.closeEntry();
                zipOutStream.flush();
                //不需要删除缓存文件的话不要下面这行
                file.delete();
            }
        } catch (IOException e) {
            log.error(......)
        } finally {
            IOUtils.closeQuietly(zipOutStream);
            IOUtils.closeQuietly(outputStream);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值